package com.flamezebra.kotlin


// 匿名函数（lambda）：匿名函数是一种没有函数名的函数，可以给变量进行赋值，写法比较简洁，一般不写return进行返回，而是隐式返回最后一行的代码
// 匿名函数分为无参和有参两种：
//      1. 无参：无参情况下可以在匿名函数中创建与匿名函数返回值类型相同的变量
//      2. 一个参数：在匿名函数体中可以使用it来代替变量
//      3. 多个参数：在匿名函数体中使用多个变量名来进行书写，不需要重新定义
// 类型推断：定义匿名函数时，可以根据函数体中的变量类型推断匿名函数的返回值类型，在书写函数体时参数名和参数类型必须写
// 注意：由于写法过于简洁，语法糖太多，所以可读性比较差，需要反复练习熟练掌握才能比较好用。
fun main() {
    val count = "Message".count()
    println("字符串长度：$count")
    // 定义一个无参匿名函数，将返回类型为String类型的值赋值给happy，在调用该变量的时候需要将匿名函数带上
    val happy:()->String = {
        val new_year = "new year."
        "Happy $new_year"
    }
    println("无参匿名函数：${happy()}")
    // 无参时可以在函数中定义变量名，返回值类型与变量类型必须相同
    var sum:()->Int = {
        val a:Int = 20
        val b:Int = 12
        a + b
    }
    // 一个参数时可以使用it来代替参数名,it关键字是自动添加的，可以写出来也可以不写
    val sum1:(Int)->Int={
        it+1
    }
    // 多个参数时直接写参数名即可
    val sum2:(Int, Int)->Int={
        a,b -> a+b
    }

    // 无参匿名函数返回值（类型推断）
    val sum3 = {
        "Hello World!"
    }

    // 带1个参匿名函数返回值（类型推断）：参数名和参数类型必须写
    val sum4 = {
        it:Int -> it
    }
    // 带多个参数匿名函数返回值（类型推断）：参数名和参数类型必须写
    val sum5 = {
        a:Int,b:Int-> a==b
    }
    // 无参匿名函数
    println("无参匿名函数：${sum()}")
    // 1个参数匿名函数
    println("1个参数匿名函数：${sum1(10)}")
    // 多个参数匿名函数
    println("多个参数匿名函数：${sum2(1,1)}")
    // 无参匿名函数（类型推断）
    println("无参匿名函数（类型推断）：${sum3()}")
    // 1个参数匿名函数（类型推断）
    println("1个参数匿名函数（类型推断）：${sum4(10)}")
    // 多个参数匿名函数（类型推断）
    println("多个参数匿名函数（类型推断）：${sum5(1,1)}")
}


fun test1(a:Int, b:() -> Int):Int{
    return a+b()
}



